//
//  Fraction.m
//  02-分数作业(老师版)
//
//  Created by LL.F on 16/7/7.
//  Copyright © 2016年 LL.F. All rights reserved.
//

#import "Fraction.h"

@implementation Fraction
//  自定义初始化方法的实现
- (id)initWithMember:(NSInteger)member denminator:(NSInteger)denminator{
    if (self = [super init]) {
        self.member = member;
        self.denominator = denminator;
    }
    return self;
}
//   便利构造器的实现
+ (id)fractionWithMember:(NSInteger)member denminator:(NSInteger)denminator{
    Fraction *fraction =[[Fraction alloc]initWithMember:member denminator:denminator];
    return fraction;
}

//************实现分数相关功能**********
/**
 实现分数+ - * / 功能的思路:
 * 1.虽然分数运算的方法中只带了一个参数，但是调用此方法的对象也是分数。所以方法内部先获取调用方法的分数对象的分子和分母,以及参数对象的分子和分母.
 * 2.对两个分数的分子和分母分别进行计算,如果是加减运算就先对分数通分.
 例如:两个分数对象的分母通分 --> 分数对象1的分母 * 分数对象2的分母,就是通分后的分母;
 分数对象1的分子 --> 分数对象1的分子 ＊ 分数对象2的分母
 分数对象2的分子 --> 分数对象2的分子 ＊ 分数对象1的分母
 * 3.根据得到新的分子和分母创建对象
 * 4.调用封装好的约分方法.
 * 5.因为分数带有返回值，所以把最终的分数返回
 */

#pragma mark -- 分数相加
- (Fraction *)addFraction:(Fraction *)anotherFraction{
    // 1.分别获取两个分数的分子和分母
    NSInteger firstMember = self.member;//分子
    NSInteger firstDeno = self.denominator;//分母
    NSInteger secondMember = anotherFraction.member;//分子
    NSInteger secondDeno = anotherFraction.denominator;//分母
    //  2.计算得到新的分子和分母
    NSInteger newMember = firstMember * secondDeno + secondMember * firstDeno;//新的分子
    NSInteger newDeno = firstDeno * secondDeno;
    //  3.根据新的分子和分母创建新的分数对象
    Fraction *newFra = [Fraction fractionWithMember:newMember denminator:newDeno];
    //  4.对新的分数进行约分
    [newFra reduce];
    return newFra;
}

//  两个分数相减
- (Fraction *)subFraction:(Fraction *)anotherFraction{
    //  1.先获取两个分数的分子和分母
    NSInteger firstMember = self.member;
    NSInteger firstDeno = self.denominator;
    NSInteger secondMember = anotherFraction.member;
    NSInteger secondDeno = anotherFraction.denominator;
    //  2.计算得到新的分子和分母
    NSInteger newMember = firstMember *secondDeno - secondMember * firstDeno;//新的分子
    NSInteger newDeno = firstDeno * secondDeno;//新的分母
    //  3.根据新的分子和分母创建新的分数对象
    Fraction *newFra = [Fraction fractionWithMember:newMember denminator:newDeno];
    //  4.对新的分数对象约分
    [newFra reduce];//
    return newFra;
}

//  两个分数相乘
- (Fraction *)mulFraction:(Fraction *)anotherFraction{
    //  1.先获取两个分数的分子和分母
    NSInteger firstMember = self.member;
    NSInteger firstDeno = self.denominator;
    NSInteger secondMember = anotherFraction.member;
    NSInteger secondDeno = anotherFraction.denominator;
    //  2.计算新的分子和分母
    NSInteger newMember = firstMember * secondMember;
    NSInteger newDeno = firstDeno * secondDeno;
    //  3.根据新的分子和分母创建新的分数
    Fraction *newFra = [Fraction fractionWithMember:newMember denminator:newDeno];
    //  4约分
    [newFra reduce];
    return newFra;
}

//  两个分数相除
- (Fraction *)divFraction:(Fraction *)anotherFraction{
    //  1.先获取两个分数的分子和分母
    NSInteger firstMember = self.member;
    NSInteger firstDeno = self.denominator;
    NSInteger secondMember = anotherFraction.member;
    NSInteger secondDeno = anotherFraction.denominator;
    //  2.计算新的分子和分母
    NSInteger newMember = firstMember * secondDeno;//分子
    NSInteger newDeno = firstDeno *secondMember;
    //  3.根据新的分子和分母创建新的分数对象
    Fraction *newFra = [Fraction fractionWithMember:newMember denminator:newDeno];
    //  4约分
    [newFra reduce];
    return newFra;
}


//  求两个数的最大公约数
//  这个方法并没有在.h文件中声明,那可以认为是私有方法，供类内部使用
- (NSInteger)maxGYWithNumber1:(NSInteger )number1 number2:(NSInteger)number2{
    //  辗转相除法,得到最大公约数
    NSInteger temp = 0;
    while (number2 != 0 ) {
        temp = number1 % number2;
        number1 = number2;
        number2 = temp;
    }
    return number1;
}
//  约分
- (void)reduce{
    //  1.获取分子和分母的最大公约数.(分子也可能为负数，取个绝对值)
    NSInteger max = [self maxGYWithNumber1:abs((int)self.member) number2:self.denominator];
    // abs();  这是一个取绝对值的函数，只不过参数类型为int型。
    //  2.用分子和分母除以最大公约数。记得要把约数之后的值设为新的分子和分母
    self.member = self.member / max;
    self.denominator /= max;
}

//输出
- (void)output{
    if (self.member == self.denominator &&  self.member != 0) {
        NSLog(@"结果为1");
    } else if (self.member + self.denominator == 0){
        NSLog(@"结果为-1");
    }
    else if (self.member == 0)
    {
        NSLog(@"0");
    }
    else{
        //否则输出分子和分母
        NSLog(@"分数为%ld/%ld" , self.member , self.denominator);
    }
}


//比较大小
- (NSComparisonResult)compare:(Fraction *)anotherfraction {
    //1.两个分数相减
    Fraction *newFra = [self subFraction:anotherfraction];
    //2.根据拿到的新分数比较大小
    if (newFra.member * newFra.denominator > 0) {
        //前大后小
        return NSOrderedDescending;//1
    }else if (newFra.member * newFra.denominator < 0) {
        return NSOrderedAscending;//-1
    }else{
        return  NSOrderedSame;// 0
    }
}


- (NSString *)description {
    return [NSString stringWithFormat:@"<%ld-%ld>", self.member, self.denominator];
}


@end
